#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <functional>
#include <vector>

#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if (id == 0)
    {
        sleep(2);
        printf("hello bit\n");
        printf("hello bit\n");
        printf("hello bit\n");
        printf("hello bit\n");
        printf("hello bit\n");
        int a = 10;
        a /= 0;
        printf("hello bit\n");

        exit(1);
    }
    int status = 0;
    waitpid(id, &status, 0);
    //低八位存储信号值，高八位存储退出码，从右往左第八位是是否发生core dump
    printf("signal: %d, exit code: %d, core dump: %d\n",
           (status & 0x7F), (status >> 8) & 0xFF, (status >> 7) & 0x1);
}


// void PrintPending(sigset_t &pending)
// {
//     std::cout<<"pending,我是一个进程:"<<getpid()<<std::endl;    
//     for(int i=31;i>=1;i--)
//     {
//         if(sigismember(&pending,i))
//             std::cout<<1;
//         else
//             std::cout<<0;
//     }
//     std::cout<<std::endl;
// }

// void handle(int sig)
// {
//     std::cout<<"----------------"<<std::endl;
//     std::cout<<"信号"<<sig<<"递达"<<std::endl;
//     sigset_t pending;
//     sigpending(&pending);
//     PrintPending(pending);
//     std::cout<<"----------------"<<std::endl;
// }

// int main()
// {
//     signal(SIGINT,handle);
//     //1.屏蔽2号信号
//     sigset_t block,oblock;//新的信号集，旧的信号集

//     //将信号集全部置零
//     sigemptyset(&block);
//     sigemptyset(&oblock);

//     //添加信号集
//     sigaddset(&block,SIGINT);//这时并没有将位图结构映射到进程的block表里
//     for(int i=0;i<32;i++)sigaddset(&block,i);

//     //此时才完成屏蔽
//     //将用户的位图结构映射到当前进程的block表里
//     int n=sigprocmask(SIG_SETMASK,&block,&oblock);
//     (void)n;

//     //程序输出结果：
//     //当cnt未到达10之前，信号被屏蔽，此时按下ctrl+c也不会触发handle函数处理动作
//     //可以看到pending表的低4位变为0010，代表信号产生但还未递达(未决)
//     //当cnt等于10时，会执行循环内的判断，解除对2号信号的屏蔽，并将pending表的比特位全部置0
//     //此时按下ctrl+c就会执行handle了，由于信号已经递达，pending表的内容不会再变化
//     int cnt=0;
//     while(true)
//     {
//         //获取pending表
//         sigset_t pending;
//         sigpending(&pending);

//         PrintPending(pending);
//         if(cnt==10)
//         {
//             std::cout<<"解除对二号信号的屏蔽"<<std::endl;
//             //用oblock替换当前block表的所有比特位
//             //sigprocmask可以修改block表的内容
//             sigprocmask(SIG_SETMASK,&oblock,nullptr);
//         }
//         sleep(1);
//         cnt++;
//     }
//     return 0;
// }



// void handler(int sig)
// {
//     std::cout << "hello sig: " << sig << std::endl;
//     signal(2, SIG_DFL); // 2 默认动作是终止
//     std::cout << "恢复处理动作" << std::endl;
// }

// int main()
// {
//     signal(2, handler); // 自定义捕捉
//     // signal(2, SIG_IGN); //忽略信号

//     sigset_t set;

//     while(true)
//     {
//         sleep(1);
//         std::cout << "." << std::endl;
//     }
//     return 0;
// }


// using func_t=std::function<void()>;
// std::vector<func_t> func;
// int m;
// void Sched()
// {
//     std::cout << "我是进程调度" << std::endl;
//     if(m%3==0)std::cout<<"切换进程"<<std::endl;
// }

// void memarymanage()
// {
//     std::cout<<"这是一个内存管理的任务"<<std::endl;
// }

// void Printlog()
// {
//     std::cout<<"这是一个打印日志的任务"<<std::endl;
// }

// void handle(int sig)
// {
//     std::cout<<"============="<<std::endl;
//     std::cout<<"收到了一个信号:"<<sig<<std::endl;
//     for(auto& elem:func)elem();
//     alarm(1);
//     std::cout<<"============="<<std::endl;

// }

// int main()
// {
//     func.push_back(Sched);
//     func.push_back(memarymanage);
//     func.push_back(Printlog);
//     signal(SIGALRM,handle);
//     alarm(1);
//     while(true)
//     {
//         m++;
//         pause();
//     }
//     return 0;
// }

// int count=0;
// void handle(int sig)
// {
    
//     std::cout<<"获得了一个信号："<<sig<<std::endl;
//     // std::cout<<count<<std::endl;
//     // exit(13);
//     std::cout<<"refresh"<<std::endl;
//     alarm(1);
// }

// int main()
// {
//     // for(int i=1;i<32;i++)signal(i,handle);
//     signal(SIGALRM,handle);
//     alarm(1);
//     int cnt=0;
//     //只设置一个闹钟时，闹钟结束后，进程捕捉信号处理后就会处于pause状态，就阻塞了
//     //在捕获方法内再次设置闹钟就会让进程一直能收到SIGALRM，一直处于唤醒状态
//     while(true)
//     {
//         //多IO,count会比较小
//         // std::cout<<"hello world,"<<cnt++<<std::endl;
//         // sleep(1);
//         // count++;
//         // std::cout<<"."<<std::endl;
//         // sleep(1);
//         pause();
//     }
// }
